c++ - constexpr 和 ODR
全部标签 我从C++应用程序中包含并使用了一些C代码,这里是重要的部分:C代码ifdef__cplusplusextern"C"{endif...typedefvoid*problem_type;...intproblematic_fn_proto(constproblem_typeconstarg);ifdef__cplusplus}endif不幸的是,由于duplicate'const'错误,这将无法编译。导致问题的是typedef。如果我只是将函数的原型(prototype)更改为:intproblematic_fn_proto(constvoid*constarg);没有更多的问题。不幸
以下是未定义的行为吗?union{intfoo;floatbar;}baz;baz.foo=3.14*baz.bar;我记得在两个序列点之间写入和读取同一底层内存是UB,但我不确定。 最佳答案 IrememberthatwritingandreadingfromthesameunderlyingmemorybetweentwosequencepointsisUB,butIamnotcertain.读取和写入同一表达式中的同一内存位置不会调用未定义的行为,除非该位置在两个序列点之间被修改多次,或者副作用相对于使用值计算的值是无序的相同
当我尝试编译这段代码时收到一条警告消息sscanf(value,"%h"PRIu16"B",&packet_size)使用Clang600.0.57(OSX)。warning:formatspecifiestype'unsignedchar*'buttheargumenthastype'uint16_t*'(aka'unsignedshort*')[-Wformat]if(sscanf(value,"%h"PRIu16"B",&packet_size)==1){~~~~^~~~~~~~~~~~但是如果我删除修饰符“h”,那么我会在GCC4.8.3(ScientificLinux7)中收
我知道constexpr允许您在编译时将对象用作常量,但是什么时候这会有益呢?我试图更好地理解关键字,但我找不到一个很好的例子来解释为什么需要它的构造函数。下面的两个例子都有效,那么为什么要将constexpr放在构造函数上呢?在构造函数上使用constexpr:#includeusingnamespacestd;classRect{public:constexprRect(intwidth,intheight):mWidth(width),mHeight(height){}constexprintgetArea()const{returnmWidth*mHeight;}private
这个问题在这里已经有了答案:WhatisthetypeofstringliteralsinCandC++?(4个答案)关闭6年前。返回constchar*的函数不能分配给char*constchar*func(){return"Thisisaconststringtwo";}但是char*直接在main中赋值了一个常量字符串:intmain(){char*d="thisisaconststringone";//worksfinechar*e=func();//errorcannotconvertfrom'constchar*'to'char*'return1;}为什么矛盾?
我想在我的constexpr函数中使用可选的习惯用法来轻松地阐明变量是否已设置。我对std::experimental::optional的尝试:constexprboolcall(){std::experimental::optionalr;r=true;//Error//Similarerrorwith://r=std::experimental::optional(true);if(!r){returnfalse;}return*r;}我得到错误:调用非constexpr函数-所以赋值是不可能的,因为这个操作不能是constexpr(Example)。但如果我实现自己的(非常丑陋
根据std::weak_ptr文档可以构造一个constexprweak_ptr:#includeconstexprweak_ptrfoo{};但是,使用clang尝试此操作会产生编译错误,提示constexpr变量不能具有非文字类型'conststd::weak_ptr',这是因为weak_ptr有一个用户提供的析构函数。(确实如此,查看libc++header)我的问题是,这是一个libc++错误,还是做constexprweak_ptr只是没有意义并且拥有constexpr默认构造函数是一个错误?我可以期待它在未来发挥作用吗? 最佳答案
我正在尝试连接两个现有代码库——一个使用C,另一个使用C++。C++代码使用std::vector而另一个基于double组。我想从C代码传递double组,在C++代码中对std::vectors执行操作,并最终将这些操作反射(reflect)在double组中。是否可以创建一个std::vector来匹配double数组占用的内存?我尝试了几种选择,但它们都涉及创建一个新vector和将double数组的拷贝复制到该vector中。例如:voidfcn(double*a,intsizeofa){std::vectorvect_a;vect_a.assign(a,a+sizeofa)
在编程时,我通常会同时处理两组条件,例如:if(A&&B){...}elseif(!A&&B){...}elseif(A&&!B){...}elseif(!A&&!B){...}它也可以使用嵌套的if语句来解决。if(A){if(B){...}else{...}}else{if(B){...}else{...}}编辑:一些新的想法,如果A和B的评估都没有副作用?所以我的问题是它们之间有任何性能差异以及它们的可读性如何?如果重要的话,我会用C++编写代码。 最佳答案 这两种情况并不相同。在第二种情况下,A和B将分别被计算一次。在第一种
我有一个调用fprintf的程序。在VisualStudio2013中,编译和执行的所有内容都没有错误和警告。现在该项目已迁移到VisualStudio2015(没有任何更改),我在大多数fprintf调用中收到以下警告:C4474:toomanyargumentspassedforformatstring大多数警告都指向以下代码行:fprintf(stderr,"Missingheaderfilename.Formantis:\n",pArg);我该如何解决这个问题?我是否需要重写我的代码,或者我的项目设置是否有问题导致这些警告?我看到了,在thisMSDN文章对这些函数进行了更改: